{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### JavaScript 中最重要的保留字（按字母顺序）\n",
    "|abstract|\telse|\tinstanceof|\tsuper|\n",
    "|:-------|:-----|:------------|:-----|\n",
    "|boolean|\tenum|\tint|\tswitch|\n",
    "|break|\texport|\tinterface|\tsynchronized|\n",
    "|byte|\textends|\tlet|\tthis|\n",
    "|case|\tfalse|\tlong|\tthrow|\n",
    "|catch|\tfinal|\tnative|\tthrows|\n",
    "|char|\tfinally|\tnew|\ttransient|\n",
    "|class|\tfloat|\tnull|\ttrue|\n",
    "|const|\tfor|\tpackage|\ttry|\n",
    "|continue|\tfunction|\tprivate|\ttypeof|\n",
    "|debugger|\tgoto|\tprotected|\tvar|\n",
    "|default|\tif|\tpublic|\tvoid|\n",
    "|delete|\timplements|\treturn|\tvolatile|\n",
    "|do|\timport|\tshort|\twhile|\n",
    "|double|\tin|\tstatic|\twith|\n",
    "[JavaScript 保留关键字](https://www.runoob.com/js/js-reserved.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 变量的命名方式：\n",
    "\n",
    "1.匈牙利命名方式：`变量名+对象描述 `    \n",
    "`整数i`  `浮点fl`  `布尔b`  `字符串s`  `数组a` `对象o`  `函数fn`  `正则re`   \n",
    "例：iAge = 18;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据类型\n",
    "**值类型(基本类型)**：字符串（String）、数字(Number)、布尔(Boolean)、空（Null）、未定义（Undefined）、Symbol。   \n",
    "**引用数据类型**：对象(Object)、数组(Array)、函数(Function)。\n",
    "\n",
    "**注**：Symbol 是 ES6 引入了一种新的原始数据类型，表示独一无二的值。\n",
    "\n",
    "**基本类型的变量是存放在栈内存（Stack）里的**    \n",
    "**引用类型的值是保存在堆内存（Heap）中的对象（Object）**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ES6 新增箭头函数，定义函数时更加简洁、易读\n",
    "```js\n",
    "// 传统定义函数方式\n",
    "function Test () {\n",
    "  //\n",
    "}\n",
    "\n",
    "const Test = function () {\n",
    "  //\n",
    "}\n",
    "\n",
    "// 使用箭头函数定义函数时可以省略 function 关键字\n",
    "const Test = (...params) => {\n",
    "  //\n",
    "}\n",
    "\n",
    "// 该函数只有一个参数时可以简写成：\n",
    "const Test = param => {\n",
    "  return param;\n",
    "}\n",
    "\n",
    "console.log(Test('hello'));   // hello\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### JavaScript 变量提升(hoisting)\n",
    "变量提升：函数声明和变量声明总是会被解释器悄悄地被\"提升\"到方法体的最顶部。     \n",
    "JavaScript 中，变量可以在使用后声明，也就是变量可以先使用再声明。  \n",
    "JavaScript 只有声明的变量会提升，初始化的不会。  \n",
    "\n",
    "**提示**：JavaScript 严格模式(strict mode)不允许使用未声明的变量。    \n",
    "\"use strict\" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。  \n",
    "它不是一条语句，但是是一个字面量表达式，在 JavaScript 旧版本中会被忽略。  \n",
    "\"use strict\" 的目的是指定代码在严格条件下执行。   \n",
    "严格模式下你不能使用未声明的变量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "什么叫变量提升？\n",
    "\n",
    "       原则上变量应该先声明后使用，但是程序员小白常常忘记声明就使用了变量，这样做js代码在执行的时候不报错，只是返回了一个undefined。这种情况就是变量提升。\n",
    "\n",
    "      计算机执行的时候会把未声明就使用的变量隐式的放到代码的最顶端。需要注意的是变量虽然发生了提升，但是给变量赋的值是不会随之提升的，所以就会得到结果undefined。\n",
    "\n",
    "什么是函数提升？\n",
    "\n",
    "       与变量提升的意思差不多，先使用函数，后再声明函数，这种违背逻辑的事情在JavaScript中是允许的，这门语言就是这么灵活。\n",
    "\n",
    "       与变量提升不同的是，函数的返回值也会随之提升，所以你会发现在<script>标签中的任何地方都能调用函数并且使用函数的返回值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.14"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"use strict\"\n",
    "x = 3.14  // 报错 (x 未定义)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### javascript:void(0) 含义\n",
    "我们经常会使用到 javascript:void(0) 这样的代码，那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢？\n",
    "\n",
    "javascript:void(0) 中最关键的是 void 关键字， void 是 JavaScript 中非常重要的关键字，该操作符指定要计算一个表达式但是不返回值。\n",
    "\n",
    "**语法格式如下：**\n",
    "```js\n",
    "<head>\n",
    "    <script type=\"text/javascript\">\n",
    "        void func()\n",
    "        javascript:void func()\n",
    "\n",
    "//         或者\n",
    "\n",
    "        void(func())\n",
    "        javascript:void(func())\n",
    "    </script>\n",
    "</head>\n",
    "```\n",
    "**补充：**\n",
    "```js\n",
    "// 阻止链接跳转，URL不会有任何变化\n",
    "<a href=\"javascript:void(0)\" rel=\"nofollow ugc\">点击此处</a>\n",
    "\n",
    "// 虽然阻止了链接跳转，但URL尾部会多个#，改变了当前URL。（# 主要用于配合 location.hash）\n",
    "<a href=\"#\" rel=\"nofollow ugc\">点击此处</a>\n",
    "\n",
    "// 同理，# 可以的话，? 也能达到阻止页面跳转的效果，但也相同的改变了URL。（? 主要用于配合 location.search）\n",
    "<a href=\"?\" rel=\"nofollow ugc\">点击此处</a>\n",
    "\n",
    "// Chrome 中即使 javascript:0; 也没变化，firefox中会变成一个字符串0\n",
    "<a href=\"javascript:0\" rel=\"nofollow ugc\">点击此处</a>\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### href=\"#\"与href=\"javascript:void(0)\"的区别\n",
    "\\# 包含了一个位置信息，默认的锚是#top 也就是网页的上端。\n",
    "\n",
    "而javascript:void(0), 仅仅表示一个死链接。\n",
    "\n",
    "在页面很长的时候会使用 # 来定位页面的具体位置，格式为：# + id。\n",
    "\n",
    "如果你要定义一个死链接请使用 javascript:void(0) 。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Javascript (Node.js)",
   "language": "javascript",
   "name": "javascript"
  },
  "language_info": {
   "file_extension": ".js",
   "mimetype": "application/javascript",
   "name": "javascript",
   "version": "13.13.0"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
